#include <iostream>
#include <memory>
#include <string>
// 简单工厂模式
// class Product
// {
// public:
//     Product() {};
//     virtual void show() = 0; // 纯虚函数, 强制子类重写
//     virtual ~Product() {};

// private:
// };

// class ProductA : public Product
// {
// public:
//     void show() override
//     {
//         std::cout << "ProductA" << std::endl;
//     }
// };

// class ProductB : public Product
// {
// public:
//     void show() override //override确保这个接口是重写的基类接口；
//     {
//         std::cout << "ProductB" << std::endl;
//     }
// };

// // 简单工厂类
// class SimpleFactory {
// public:
//     enum ProductType { PRODUCT_A, PRODUCT_B }; // 产品类型枚举

//     static std::unique_ptr<Product> createProduct(ProductType type) {
//         switch (type) {
//         case PRODUCT_A:
//             return std::make_unique<ProductA>();
//         case PRODUCT_B:
//             return std::make_unique<ProductB>();
//         default:
//             return nullptr;
//         }
//     }
// };

// int main()
// {
//     std::unique_ptr<Product> product1 = SimpleFactory::createProduct(SimpleFactory::PRODUCT_A);
//     product1->show();
//     std::unique_ptr<Product> product2 = SimpleFactory::createProduct(SimpleFactory::PRODUCT_B);
//     product2->show();
//     return 0;
// }

// 工厂方法模式
// 文档抽象基类
// class Document {
// public:
//     virtual void open() = 0; // 纯虚函数
//     virtual ~Document() = default;
// };

// // 具体文档类：Word文档
// class WordDocument : public Document {
// public:
//     void open() override {
//         std::cout << "Opening Word Document" << std::endl;
//     }
// };

// // 具体文档类：PDF文档
// class PDFDocument : public Document {
// public:
//     void open() override {
//         std::cout << "Opening PDF Document" << std::endl;
//     }
// };

// // 工厂基类
// class DocumentFactory {
// public:
//     virtual std::unique_ptr<Document> createDocument() = 0; // 纯虚函数
//     virtual ~DocumentFactory() = default;
// };

// // 具体工厂类：Word文档工厂
// class WordDocumentFactory : public DocumentFactory {
// public:
//     std::unique_ptr<Document> createDocument() override {
//         return std::make_unique<WordDocument>();
//     }
// };

// // 具体工厂类：PDF文档工厂
// class PDFDocumentFactory : public DocumentFactory {
// public:
//     std::unique_ptr<Document> createDocument() override {
//         return std::make_unique<PDFDocument>();
//     }
// };

// // 使用示例
// int main() {
//     // 构建工厂对象
//     std::unique_ptr<DocumentFactory> wordFactory = std::make_unique<WordDocumentFactory>();
//     // 使用工厂对象构造具体的文档对象
//     std::unique_ptr<Document> wordDoc = wordFactory->createDocument();
//     wordDoc->open();

//     std::unique_ptr<DocumentFactory> pdfFactory = std::make_unique<PDFDocumentFactory>();
//     std::unique_ptr<Document> pdfDoc = pdfFactory->createDocument();
//     pdfDoc->open();

//     return 0;
// }

// 抽象工厂模式
// 按钮抽象基类
class Button {
public:
    virtual void click() = 0; // 纯虚函数
    virtual ~Button() = default;
};

// 文本框抽象基类
class TextBox {
public:
    virtual void type() = 0; // 纯虚函数
    virtual ~TextBox() = default;
};

// Windows按钮
class WindowsButton : public Button {
public:
    void click() override {
        std::cout << "Windows Button Click" << std::endl;
    }
};

// Windows文本框
class WindowsTextBox : public TextBox {
public:
    void type() override {
        std::cout << "Typing in Windows TextBox" << std::endl;
    }
};

// MacOS按钮
class MacOSButton : public Button {
public:
    void click() override {
        std::cout << "MacOS Button Click" << std::endl;
    }
};

// MacOS文本框
class MacOSTextBox : public TextBox {
public:
    void type() override {
        std::cout << "Typing in MacOS TextBox" << std::endl;
    }
};

// 抽象工厂基类
class GUIFactory {
public:
    virtual std::unique_ptr<Button> createButton() = 0; // 纯虚函数
    virtual std::unique_ptr<TextBox> createTextBox() = 0; // 纯虚函数
    virtual ~GUIFactory() = default;
};

// Windows工厂
class WindowsFactory : public GUIFactory {
public:
    std::unique_ptr<Button> createButton() override {
        return std::make_unique<WindowsButton>();
    }
    std::unique_ptr<TextBox> createTextBox() override {
        return std::make_unique<WindowsTextBox>();
    }
};

// MacOS工厂
class MacOSFactory : public GUIFactory {
public:
    std::unique_ptr<Button> createButton() override {
        return std::make_unique<MacOSButton>();
    }
    std::unique_ptr<TextBox> createTextBox() override {
        return std::make_unique<MacOSTextBox>();
    }
};

// 使用示例
int main() {
    std::unique_ptr<GUIFactory> factory;

    // 假设在Windows平台
    factory = std::make_unique<WindowsFactory>();
    std::unique_ptr<Button> button = factory->createButton();
    std::unique_ptr<TextBox> textBox = factory->createTextBox();

    button->click();
    textBox->type();

    // 假设在MacOS平台
    factory = std::make_unique<MacOSFactory>();
    button = factory->createButton();
    textBox = factory->createTextBox();

    button->click();
    textBox->type();

    return 0;
}